package com.zx.framework.db;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;

import com.zx.framework.core.pagination.Pagination;

public interface IBaseDAO {
	/**
	 * 循环设置占位参数
	 * ?形式一般使用数组，:id形式一般使用keyvalue
	 * @param qry
	 * @param params
	 */
	public void setParameters(Query qry, Object... params);
	
	/**
	 * 根据ID返回查询对象
	 * 
	 * @param <T>
	 * @param id
	 * @param type
	 * @return
	 */
	public <T, PK extends Serializable> T findById(PK id, Class<T> type);

	/**
	 * 删除数据库对象
	 * 
	 * @param obj
	 * @return
	 */
	public void remove(Object obj);

	/**
	 * 保存数据库对象
	 * 
	 * @param obj
	 */
	public void save(Object obj);

	/**
	 * 更新数据库对象
	 * 
	 * @param obj
	 * @return
	 */
	public void update(Object obj);

	/**
	 * 执行hibernate merge
	 * 
	 * @param obj
	 * @return
	 */
	public void merge(Object obj);
	
	/**
	 * 保存或修改
	 * 
	 * @param entity
	 */
	public void saveOrUpdate(Object entity);

	/**
	 * 执行sql语句
	 * 
	 * @param sql
	 * @param params
	 * @return 记录变更条数
	 */
	public int executeSQL(final String sql, final Object... params);

	/**
	 * 执行hql语句
	 * 
	 * @param hql
	 * @param params
	 * @return 记录变更条数
	 */
	public int executeHQL(final String hql, final Object... params);

	/**
	 * 获取hql查询列表,返回map数据 如果start 和size不满足，则返回所有数据
	 * 
	 * @param hql
	 * @param params
	 *                占位参数
	 * @param start
	 *                开始记录位置
	 * @param size
	 *                返回记录条数
	 * @return MAP
	 */
	public <E> List<E> baseQueryHQL(final String hql, final int start,
			final int size, final Object... params);

	/**
	 * 获取分页对象
	 * 
	 * @param qryHql
	 * @param cntHql
	 * @param start
	 * @param size
	 * @param params
	 * @return
	 */
	public <E> Pagination<E> hqlPageQuery(String qryHql, String cntHql,
			int current, int size, Object... params);

	/**
	 * 获取hql查询列表，相当于start和size不满足判断
	 * 
	 * @param hql
	 * @param params
	 *                占位参数
	 * @return
	 */
	public <E> List<E> queryHQL(String hql, Object... params);

	/**
	 * 获取sql查询列表
	 * 
	 * @param hql
	 * @param params
	 *                占位参数
	 * @param start
	 *                开始记录位置
	 * @param size
	 *                返回记录条数
	 * @return
	 */
	public <E> List<E> baseQuerySQL(String sql, int start, int size,
			Object... params);

	/**
	 * 获取分页对象
	 * 
	 * @param qryHql
	 * @param cntHql
	 * @param start
	 * @param size
	 * @param params
	 * @return
	 */
	public <E> Pagination<E> sqlPageQuery(String qrySql, String cntSql,
			int current, int size, Object... params);

	/**
	 * 获取sql查询列表，相当于start和size不满足判断
	 * 
	 * @param hql
	 * @param params
	 *                占位参数
	 * @return java.util.Map
	 */

	public <E> List<E> querySQL(String sql, Object... params);

	/**
	 * 根据属性值返回对象列表
	 * 
	 * @param entityName
	 *                实体名称
	 * @param propertyName
	 * @param value
	 * @param orders
	 *                排序的字段名称及升降序
	 * @return
	 */

	public <E> List<E> findByProperty(String entityName,
			String propertyName, Object value, String... orders);

	/**
	 * 根据属性值返回对象列表
	 * 
	 * @param entityName
	 *                实体名称
	 * @param queryParam
	 * @param orders
	 *                排序的字段名称及升降序
	 * @return
	 */

	public <E> List<E> findByProperty(String entityName,
			KeyValue queryParam, String... orders);

	/**
	 * 根据属性值返回对象列表
	 * 
	 * @param entityName
	 *                实体名称
	 * @param propertyName
	 * @param value
	 * @return
	 */

	public <E> List<E> findByProperty(String entityName,
			String propertyName, Object value);

	/**
	 * 根据属性值返回对象列表
	 * 
	 * @param entityName
	 * @param queryParam
	 * @return
	 */

	public <E> List<E> findByProperty(String entityName, KeyValue queryParam);

	/**
	 * 在表tableName中查找属性propertyNames值为values的数据， 所有条件求取并集，
	 * 并且按照orders进行排序，如列表中保存两项：“id desc”，“name”
	 * 表必须在hibernate中声明，返回列表为hibernate声明结构类。
	 * 
	 * @param tableName
	 * @param queryParams
	 * @param start
	 * @param size
	 * @param orders
	 * @return
	 */

	public <E> List<E> findByPropertys(String tableName,
			List<KeyValue> queryParams, int start, int size,
			String... orders);

	/**
	 * 在表tableName中查找属性propertyNames值为values的数据， 所有条件求取并集，
	 * 并且按照orders进行排序，如列表中保存两项：“id desc”，“name”
	 * 表必须在hibernate中声明，返回列表为hibernate声明结构类。
	 * 
	 * @param tableName
	 * @param queryParams
	 * @param orders
	 * @return
	 */

	public <E> List<E> findByPropertys(String tableName,
			List<KeyValue> queryParams, String... orders);

	/**
	 * 返回所有对象
	 * 
	 * @param tableName
	 * @return
	 */

	public <E> List<E> findAll(String tableName);

	/**
	 * 返回排序的所有对象
	 * 
	 * @param tableName
	 * @param orders
	 * @return
	 */

	public <E> List<E> findAll(String tableName, String... orders);

	/**
	 * 返回单条统计函数值 例如count 或者确实只有一条记录返回的时候
	 * 
	 * @param <T>
	 * @param hql
	 * @param type
	 * @return
	 */
	public <T> T getHQLUnique(String hql, Class<T> type, Object... params);

	/**
	 * 返回单条统计函数值 例如count size 或者确实只有一条记录返回的时候
	 * 
	 * @param <T>
	 * @param sql
	 * @param type
	 * @return
	 */
	public <T> T getSQLUnique(String sql, Class<T> type, Object... params);
	/**
	 * 批量执行
	 * @param updateSql
	 * @param params
	 * @return
	 */
	public int bulkUpdate(String updateSql, Object... params);
	/**
	 * 批量刷新session
	 */
	public void flush();
	
}
